//先两两算出结果，计数在f中
//然后对于每一个元素，要找到能和它&之后得到0的二元组的f之和，则(1<<16)-1-num就是其可能的最大值，这个数的子集也满足条件
//子集用经典的p=(p-1)&k
public class Solution982 {
    public int countTriplets(int[] nums) {
        int[] f=new int[1<<16];
        for (int num : nums) {
            for (int i : nums) {
                f[i&num]++;
            }
        }
        int ans=0;
        for (int num : nums) {
            int k=(1<<16)-1-num;
            int p=k;
            do{
                ans+=f[p];
                p=(p-1)&k;
            }while (k!=p);
        }
        return ans;
    }


    public static void main(String[] args) {
        System.out.println(new Solution982().countTriplets(new int[]{2,1,3}));
    }
}
